package router

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
	"go-admin/define"
	"go-admin/middleware"
	"go-admin/services"
)

func App() *gin.Engine {
	router := gin.Default()
	// 添加跨域中间件
	router.Use(middleware.Cors())
	// 日志中间件
	router.Use(middleware.LoggerToDb())

	// 使用session中间件
	store := cookie.NewStore([]byte("secret"))
	store.Options(sessions.Options{
		Secure:   true,
		SameSite: 4,
		Path:     "/",
		MaxAge:   3600,
	})
	router.Use(sessions.Sessions("admin-session", store))

	// 设置静态资源路由
	router.Static("/uploadFile", define.StaticResource)
	// 根据用户名和密码登录路由
	router.POST("/login/password", services.LoginPassword)
	// 登录认证
	loginAuth := router.Group("/").Use(middleware.LoginAuthCheck())

	// 上传图片文件
	loginAuth.POST("/upload/file", services.UploadFile)

	// 获取管理员用户信息
	loginAuth.GET("/user", services.GetUserList)
	// 管理员新增
	loginAuth.POST("/user", services.AddUser)
	// 获取管理员详情信息
	loginAuth.GET("/user/detail/:id", services.GetUserDetail)
	// 更新用户信息
	loginAuth.PUT("/user", services.UpdateUser)
	// 删除用户信息
	loginAuth.DELETE("/user/:id", services.DeleteUser)

	// 更新用户信息
	loginAuth.PUT("/user/updateInfo", services.UpdateInfo)

	// 发送邮箱
	loginAuth.GET("/user/sendEmail", services.SendEmail)
	loginAuth.GET("/user/verifyCode", services.VerifyCode)
	loginAuth.PUT("/user/updateEmail", services.UpdateEmail)
	loginAuth.PUT("/user/updatePwd", services.UpdatePwd)

	// 获取角色列表
	loginAuth.GET("/role", services.GetRoleList)
	// 新增角色
	loginAuth.POST("/role", services.AddRole)
	// 获取角色详情信息
	loginAuth.GET("/role/detail/:id", services.GetRoleDetail)
	// 更新角色信息
	loginAuth.PUT("/role", services.UpdateRole)
	// 删除角色信息
	loginAuth.DELETE("/role/:id", services.DeleteRole)
	// 修改角色身份（是否超管）
	loginAuth.PATCH("/role/:id/:isAdmin", services.PatchRoleAdmin)
	// 获取所有角色
	loginAuth.GET("/role/all", services.AllRole)

	// 获取菜单树
	loginAuth.GET("/menu", services.GetMenuList)
	loginAuth.POST("/menu", services.AddMenu)
	loginAuth.GET("/menu/detail/:id", services.GetMenuDetail)
	loginAuth.PUT("/menu", services.UpdateMenu)
	loginAuth.DELETE("/menu/:id", services.DeleteMenu)

	// 日志管理
	loginAuth.GET("/log", services.GetLogList)
	return router
}
